/*
***************************copy right of netinnet.cn ***************************
                           ver 20050826
*/
/* ===============javascript类：对象   
   ENCODER 编码表(id,name)       对象
   ENCODER2编码表(id,name,name2) 对象
   由于javascript大小写敏感，每个方法都有一个 全部为小写名的 同构方法 以减少程序错误 
*/

/*普通编码（id,name）对象 ================================================*/
function ENCODER()
{
  this.rowCount = 0;
  this.ids = new Array();
  this.names= new Array();
  
  this.addOneRow2Col = addOneRow2Col;//增加一行记录
  this.addonerow2col = addonerow2col;//增加一行记录

  this.hasId  = hasId;               //判断是否有ID，如有返回true，否false
  this.hasid  = hasid;               //判断是否有ID，如有返回true，否false
  this.hasName = hasName;
  this.hasname = hasname;
  this.hasIdOrName = hasIdOrName;
  this.hasidorname = hasidorname;
  
  this.returnName = returnName;//根据ID返回name
  this.returnname = returnname;//根据ID返回name
  
  this.checkId = checkId;      //判断输入域是否在id范围内，如无则弹出窗口警告，同时清除输入域
  this.checkid = checkid;      //判断输入域是否在id范围内，如无则弹出窗口警告，同时清除输入域
  this.checkIdAndSetNameField = checkIdAndSetNameField;
  this.checkidandsetnamefield = checkidandsetnamefield;
  this.filterListArray2col = filterListArray2col;//返回筛选id的符合条件的Array

  this.copyToListBox = copyToListBox;
  this.copytolistbox = copytolistbox;
}

/*普通编码（id,name1,name2）对象  =======================================
  用途： 普通编码表应用
         两个关联编码表应用（listbox1选择结果影响listbox2列表内容） */
function ENCODER2()
{
  this.rowCount=0;
  this.ids = new Array();
  this.names= new Array();
  this.name2s= new Array();
  this.addOneRow3Col = addOneRow3Col;//增加一行记录
  this.addonerow3col = addonerow3col;//增加一行记录
  
  this.hasId  = hasId;               //判断是否有ID，如有返回true，否false
  this.hasid  = hasid;               //判断是否有ID，如有返回true，否false
  this.hasName = hasName;
  this.hasname = hasname;
  this.hasIdOrName = hasIdOrName;
  this.hasidorname = hasidorname;

  this.returnName = returnName;  //根据ID返回name
  this.returnname = returnname;//根据ID返回name
  this.returnName2 = returnName2;//根据ID返回name2 本方法为 ENCODER2 独有
  this.returnname2 = returnname2;//根据ID返回name2 本方法为 ENCODER2 独有
  
  this.checkId = checkId;        //判断输入域是否在id范围内，如无则弹出窗口警告，同时清除输入域
  this.checkid = checkid;      //判断输入域是否在id范围内，如无则弹出窗口警告，同时清除输入域
  this.checkIdAndSetNameField = checkIdAndSetNameField;
  this.checkidandsetnamefield = checkidandsetnamefield;
  this.checkIdAndSet2NameField = checkIdAndSet2NameField;/*本方法为 ENCODER2 独有*/
  this.checkidandset2namefield = checkidandset2namefield;

  this.filterListArray = filterListArray;//返回筛选id的符合条件的Array
  this.filterAndRefreshListBox = filterAndRefreshListBox;/*本方法为 ENCODER2 独有*/
  this.filterandrefreshlistbox = filterandrefreshlistbox;/*本方法为 ENCODER2 独有*/

  this.copyToListBox  =  copyToListBox; 
  this.copytolistbox = copytolistbox;
}


/*
  增加一行编码记录(id,name) ------------------------------------------------------------
  应用于 ENCODER 类 增加记录 
*/
function addOneRow2Col(arg_id,arg_name)
{ //test
  this.ids[this.rowCount] = arg_id;
  this.names[this.rowCount] = arg_name;
  this.rowCount++;
  return true;
}
function addonerow2col(arg_id,arg_name)
{ return this.addOneRow2Col(arg_id,arg_name);}

/*
  增加一行编码记录(id,name1,name2) ----------------------------------------------------
  应用于 ENCODER2 类  增加记录 
  */
function addOneRow3Col(arg_id,arg_name1,arg_name2)
{ //test
  this.ids[this.rowCount] = arg_id;
  this.names[this.rowCount] = arg_name1;
  this.name2s[this.rowCount] = arg_name2;
  this.rowCount++;
  return true;
}
function addonerow3col(arg_id,arg_name1,arg_name2)
{return this.addOneRow3Col(arg_id,arg_name1,arg_name2);}


/*
  判断是否存在 某个ID值的记录，如有返回true ，否返回false ------------------------------
  可应用于：ENCODER , ENCODER2 对象 
*/
function hasId(arg_idValue)
{ //test
  for(var i=0;i<this.rowCount;i++)
      if (arg_idValue==this.ids[i]) return true;
  return false;
}
function hasid(arg_idValue)
{  return this.hasId(arg_idValue); }

/*
  判断是否存在 某个Name 值的记录，如有返回true ，否返回false----------------------------- 
  可应用于：ENCODER , ENCODER2 对象 
*/
function hasName(arg_nameValue)
{ //test 
  for(var i=0;i<this.rowCount;i++)
      if (arg_nameValue==this.names[i]) return true;
  return false;
}
function hasname(arg_nameValue)
{ return this.hasName(arg_nameValue);}

/*
  判断 参数值 是否 包括在ID 列表 或 NAME列表中    -------------------------------------
  可应用于：ENCODER , ENCODER2 对象 
*/
function hasIdOrName(arg_Value)
{ //test
  if (this.hasId(arg_Value)==true) return true;
  if (this.hasName(arg_Value)==true) return true;
  return false;
}
function hasidorname(arg_Value)
{return  this.hasIdOrName(arg_Value);}


/*
  根据ID值返回 name值 ， 如果没有找到对应的id,则 返回 "" ------------------------------
  可应用于：ENCODER , ENCODER2 对象 
*/
function returnName(arg_idValue)
{//test
  for(var i=0;i<this.rowCount;i++)
    if (arg_idValue==this.ids[i]) return this.names[i];
  return "";
}
function returnname(arg_idValue)
{return this.returnName(arg_idValue);}

/*
  根据ID值返回 name2 值 ， 如果没有找到对应的id,则 返回 "" ---------------encoder2---------
  只应用于 ENCODER2 
*/
function returnName2(arg_idValue)
{//test
  for(var i=0;i<this.rowCount;i++)
    if (arg_idValue==this.ids[i]) return this.name2s[i];
  return "";
}
function returnname2(arg_idValue)
{return this.returnName2(arg_idValue);}


/*
  检查ID输入域的输入值是否在 ID 列表中 ---------------------------------------------------
  如有，则返回true
  如无，则弹出警告信息，返回 false 
  应有示例： 
  可应用于：ENCODER , ENCODER2 对象 
应用示例：
<SCRIPT LANGUAGE="JavaScript">
function check()
{
  var a = new ENCODER(3);
  a.addOneRow(1,'aa');
  a.addOneRow(2,'bb');
  a.addOneRow(3,'cc');
  return a.checkId(form1.b,"input error");
}
</SCRIP>

<input type="text" name="b"  onchange="return check();" />
表现：当输入域b的输入值不在1,2,3范围内时，将弹出input error窗口，同时光标留在 b域 直至输入正确值为止,
     可按ctrl-z键使b域回到前一个输入值

*/
function checkId(obj_inputIdField,arg_errorMsg)
{
  if (this.hasId(obj_inputIdField.value)) return true;
  else { alert(arg_errorMsg); return false; }
}
function checkid(obj_inputIdField,arg_errorMsg)
{return  this.checkId(obj_inputIdField,arg_errorMsg);}



/*检查ID输入域的输入值是否在 ID 列表中 ----------------------------------------------------
  如有，则同时修正相应的name输入域的值， 返回true
  如无，则弹出警告信息，返回 false 
  可应用于：ENCODER , ENCODER2 对象 

应用示例：
<SCRIPT LANGUAGE="JavaScript">
function check()
{
  var a = new ENCODER(3);
  a.addOneRow(1,'aa');
  a.addOneRow(2,'bb');
  a.addOneRow(3,'cc');
  //alert( a.returnName(2));
  //if (a.hasIdOrName('1')) alert("hasIdOrName");
  return a.checkIdAndSetNameField(form1.b,form1.c,"input error");
}
</SCRIPT>

        <input type="text" name="b"  onchange="return check();" />
表现：当b域输入1时，c域值自动置成'aa';当输入4时，弹出input error窗口，同时光标留在b域，
     可按ctrl-z键使b域回到前一个输入值
*/
function checkIdAndSetNameField(obj_inputIdField,obj_inputNameField,arg_errorMsg)
{
  if (this.hasId(obj_inputIdField.value)) 
  {
     obj_inputNameField.value  = this.returnName(obj_inputIdField.value);
     return true;
  }
  else 
  { 
      alert(arg_errorMsg); 
      return false; 
  }
}
function checkidandsetnamefield(obj_inputIdField,obj_inputNameField,arg_errorMsg)
{return this.checkIdAndSetNameField(obj_inputIdField,obj_inputNameField,arg_errorMsg);}

/*------------------------------------------------------------------ENCODER2 --------------------------
  检查ID输入域的输入值是否在 ID 列表中 
  如有，则同时修正相应的name输入域的值， 返回true
  如无，则弹出警告信息，返回 false 
  应用示例：
<SCRIPT LANGUAGE="JavaScript">
{
  var A = new ENCODER2(3);
  a.addOneRow(1,'aa','aaaaaaaaaaaaaa');
  a.addOneRow(2,'bb','bbbbbbbbbbbbbb');
  a.addOneRow(3,'cc','cccccccccccccc');
}
</SCRIPT>
</head>
 <input type="text" name="b"  onchange="javascript:A.checkIdAndSetNameField(form1.b,form1.c,form1.d, 'input error');" />

表现：当b域输入1时，c域值自动置成'aa';d域自动置成'aaaaaaaaaaaaaaaa';当输入4时，弹出input error窗口，同时光标留在b域，
     可按ctrl-z键使b域回到前一个输入值
*/
function checkIdAndSet2NameField(obj_inputIdField,obj_inputName1Field,obj_inputName2Field,arg_errorMsg)
{
  if (this.hasId(obj_inputIdField.value)) 
  {
     obj_inputName1Field.value  = this.returnName1(obj_inputIdField.value);
     obj_inputName2Field.value  = this.returnName2(obj_inputIdField.value);
     return true;
  }
  else 
  { 	
  	if(arg_errorMsg!=''){	
      alert(arg_errorMsg); 
      }
      return false; 
  }
}
function checkidandset2namefield(obj_inputIdField,obj_inputName1Field,obj_inputName2Field,arg_errorMsg)
{ return this.checkIdAndSet2NameField(obj_inputIdField,obj_inputName1Field,obj_inputName2Field,arg_errorMsg);}


/*------------------将ENCODER2------------------------------------------------------------- 
  将对象中所有id=arg_value的(name1,name2)记录 拷贝到 obj_listBox中（listbox中原有记录将被删除）
  name1-> value , name2-> text 
  应用示例：
<SCRIPT LANGUAGE="JavaScript">
{
  var zsd = new ENCODER2();
  zsd.addOneRow(1,'aa1','aaaaaaaaa1');
  zsd.addOneRow(1,'aa2','aaaaaaaaa2');
  zsd.addOneRow(1,'aa3','aaaaaaaaa3');
  zsd.addOneRow(1,'aa4','aaaaaaaaa4');
  zsd.addOneRow(1,'aa5','aaaaaaaaa5');
  zsd.addOneRow(2,'bb1','bbbbbbbbb1');
  zsd.addOneRow(2,'bb2','bbbbbbbbb2');
  zsd.addOneRow(2,'bb3','bbbbbbbbb3');
  zsd.addOneRow(2,'bb4','bbbbbbbbb4');
  zsd.addOneRow(2,'bb5','bbbbbbbbb5');
  zsd.addOneRow(2,'bb6','bbbbbbbbb6');
  zsd.addOneRow(3,'cc1','ccccccccc1');
  zsd.addOneRow(3,'cc2','ccccccccc2');
  zsd.addOneRow(3,'cc3','ccccccccc3');
  zsd.addOneRow(3,'cc4','ccccccccc4');
  zsd.addOneRow(3,'cc5','ccccccccc5');
  zsd.addOneRow(3,'cc6','ccccccccc6');
}
</SCRIPT>  
    <form name='form2'>
        <select size="8"  name='lista' onchange="zsd.filterAndRefreshListBox(this.value,form2.listb);">
        <select size="1" name="listb"/>
    定义两个listbox:lista,listb , 在lista中定义 onchange事件，执行filterAndRefreshListBox
    结果： 当lista选中value=1 时，则在 listb中会清除所有记录后，把zsd对象中id=1的所有记录(name1,name2)添加到listb中 
*/
function filterListArray2col(){
   var v_copyCount=0,v_array=[];
    for (var i=0;i<this.rowCount;i++)
    { 
        v_array.push({
            id:this.ids[i],
            value:this.names[i] 
          }); 
          v_copyCount++; 
    }
    return {
       array:v_array,
       v_copyCount:v_copyCount
    }
}

function filterListArray(arg_value,obj_listBox){
  var v_copyCount=0,v_array=[];
    for (var i=0;i<this.rowCount;i++)
    { 
       if (this.ids[i]==arg_value) 
      {  
          v_array.push({
            pid:this.ids[i],
            value:this.names[i],
            text:this.name2s[i]
          });
           
          v_copyCount++;
      }
    }
    return {
       array:v_array,
       v_copyCount:v_copyCount
    }
}

function filterAndRefreshListBox(arg_value,obj_listBox)
{ //test in win ie6 ok 
   	//alert('begin');
     /*20140730 修改引入jquery*/
     //拷贝符合条件的记录
    
    var html = '',
        listObj = filterListArray.call(this,arg_value,obj_listBox),
        v_array = listObj.array,
        v_copyCount = listObj.v_copyCount;
    $(obj_listBox).each(function(i,o){
       $(this).html('');
       if(html==='')
       for(var i=0;v_array[i];i++){
          html+='<option value="'+v_array[i]['value']+'">'+v_array[i]['text']+'</option>'
       }
       $(this).html(html); 
    }) 
   //alert(obj_listBox.options[obj_listBox.options.length-1])
    return v_copyCount;
}
function filterandrefreshlistbox(arg_value,obj_listBox)
{return this.filterAndRefreshListBox(arg_value,obj_listBox);}
 
/*
  将对象的(id,name)的所有记录拷贝到 listbox中 -------------------------------------------
  可应用于：ENCODER , ENCODER2 对象 
*/
function copyToListBox(obj_listbox)
{ //test in win ie6 ok 
   	//清除listbox 
    for(var i=obj_listbox.options.length-1;i>=0;i--) 
          obj_listbox.options[i]=null;
    //拷贝记录
    for (var i=0;i<this.rowCount;i++)
    { 
      	  var v_o = new Option();
          v_o.value =this.ids[i];
          v_o.text = this.names[i];
          //v_o.selected=true;
          obj_listbox.options[i] = v_o;
    }
}
function copytolistbox(obj_listbox)
{return this.copyToListBox(obj_listbox);}

/*====================       应用示例         ===================================
<SCRIPT LANGUAGE="JavaScript" src="./javascript/encoder.js"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
{
  var a = new ENCODER();
  a.addOneRow2Col(1,'aa');
  a.addOneRow2Col(2,'bb');
  a.addOneRow2Col(3,'cc');
  
  alert( a.returnname(2));

  var b = new ENCODER2();
  b.addOneRow3Col(1,'aa','aaaaaa');
  b.addOneRow3Col(2,'bb','bbbbbbb');
  b.addOneRow3Col(3,'cc','cccccccc');
  alert( b.returnname2(3));
}
</SCRIPT>


===============================================================================*/